메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

Tar로 파일 백업하기

한빛미디어

|

2002-06-26

|

by HANBIT

17,555

저자: 드루 라빈, 역 신동섭

지난번 기사(아카이버의 이해)에서 필자는 아카이버의 개념에 대해 소개하였다. 이번 기사에서는 tar 아카이버 사용법을 실제로 시연해 보이려고 한다.

파일들을 백업하고 재저장 할 것이기 때문에 여러분이 tar유틸리티를 원활히 사용할 때까지는 테스트 유저 계정으로 연습하기를 권장한다. 내 시스템에서 나는 수퍼유저이고 test로 명명한 테스트 계정을 만들기 위해 다음과 같이 adduser 명령을 사용했다.
su
Password:
adduser
그리고 난 후 test라고 불리는 유저를 만들기 위해 프롬프트가 나타난다.

다음으로 이 테스트 유저 홈 디렉토리로 파일들과 하부 디렉토리들을 빨리 추가하고 싶다. 내 시스템에 인스톨된 포트 집합이 있기 때문에 그 하부 디렉토리 중 하나를 복사했다.
cp -r /usr/ports/www/ ~test/
나는 이 파일들의 소유를 변경하여 테스트 사용자에 속하게 했다.
chown -R test ~test/www/*
현재 실습을 할 수 있는 파일들이 테스트 디렉토리에 많이 있다. test 유저로 로긴하여 내 홈 디렉토리 내용을 점검했다.
ls -l
total 16
drwxr-xr-x  375 test  wheel  9728 May 11 09:53 www/

du -h | tail -2
 28M	./www
 28M	.
한권으로 끝내는 유닉스
테스트 디렉토리에서 동작하는 28M정도의 데이터가 있는 것처럼 보인다. 이론적으로 tar는 이 명령어만큼 사용하기 쉽다.
tar c .
여기서 c는 "하나의 아카이브를 생성하라"는 것을 의미하고 "."는 "현재 디렉토리"를 의미한다. 그러나 만약 이를 시도하려 한다면 아마도 내가 했던 것과 같은 에러 메시지가 뜰 것이다.
tar c .
tar: can"t open /dev/sa0 : Permission denied
아하, 이제 여러분은 다음과 같이 생각할 수도 있다. 내가 슈퍼유저로 시도해 봐야겠다.
su
Password:
tar c .
tar: can"t open /dev/sa0 : Device not configured
지난번 기사에서 내가 테잎 디바이스에 대해 얘기했던 것을 기억하는가? 기본적으로 tar 유틸리티는 여러분 PC에 붙어있는 드라이브를 가지게 될 경우 큰 첫번째 SCSI 테잎 드라이브(/dev/sa0)로 백업하기를 원할 것이라고 생각할 것이다. 그렇지만 여러분이 원치 않을 경우 잃어버리는 것은 없다. 유닉스에서 테잎 디바이스는 아주 간단한 파일일 뿐이다. 따라서 그 파일이 다른 형태의 테잎 디바이스, 플로피나 다른 하드 드라이브, 또는 네트워크상의 다른 PC, 그것도 아니면 시스템 어딘가에 있는 실제 파일인지 아닌지에 상관없이 다른 파일로 백업을 생성하라고 tar에게 지시하기는 쉽다.

필자는 현재 디렉토리(.)의 백업본을 내가 backup.tar을 호출할 파일로 생성(c)하라고 tar명령을 내리는 것으로 간단하게 시작해볼 것이다. 기본 백업 지역은 아니기 때문에 백업본을 보내고 싶은 파일이름을 지정하기위해 스위치 f를 사용할 것이다.
tar cf backup.tar .
내가 이 명령을 수행하면 잠시동안 프롬프트가 사라지고 하드 드라이브가 열심히 돌아가는 소리가 난다. 프롬프트가 다시 나타나면 홈 디렉토리에 backup.tar라 명명된 파일이 나타날 것이다. 만약 기다리는 것이 싫다면 v 스위치를 사용해보자. tar는 동작하는 동안 무슨 일을 하고 있는지 보여줄 것이다. 그 백업파일을 지우고 v스위치로 다시 시도해 볼 것이다.
rm backup.tar
tar cvf backup.tar .
이것을 시도해보면 그 차이를 이해할 수 있을 것이다. 지금 생성된 tar파일이 무슨 형태인지 살펴보도록 하자.
file backup.tar
backup.tar: GNU tar archive
ASCII 텍스트 파일이 아니기 때문에 페이저(pager)나 에디터로 그 내용들을 볼 수 없다. 그러나 tar 명령이 이 파일을 이해하고 있기 때문에 t 스위치를 사용하여 그 파일을 읽어달라고 요청할 수는 있다.
tar t backup.tar
tar: can"t open /dev/sa0 : Device not configured
아니 이런… 어디를 봐야 하는지를 말해주지 않으면tar는 SCSI 테잎 디바이스를 읽어버린다는 사실을 깜빡 잊어버렸다. 그래서 다시 시도해 볼 것이다. 이번에는 f 스위치를 포함하여 시도할 것이다.
tar tf backup.tar
이번에는 파일 묶음과 디렉토리들이 너무 빨리 지나가 버렸다. 그래서 백업이 성공적으로 된 것처럼 보인다. 만약 파일리스트를 확인하고 싶다면 한번에 한 페이지씩 읽을 수 있도록 pager로 결과를 보내자.
tar tf backup.tar |more
tar를 사용할 때 zZ중 하나를 포함하여 압축된 백업을 생성하는 것도 가능하다. 방금 생성한 그 백업파일의 크기를 살펴보자.
ls -l backup.tar
-rw-r--r--  1 root  wheel  25722880 May 11 16:41 backup.tar
지금 그 백업파일을 지우고 gzip 유틸리티를 사용하여 압축된 백업을 생성하도록 tar 명령을 내리면 크기와 형태상의 차이점이 보인다.
rm backup.tar
tar cvzf backup.tar.gz .

ls backup.tar.gz
-rw-r--r--  1 root  wheel  5899840 May 11 16:45 backup.tar.gz

file backup.tar.gz
backup.tar.gz: gzip compressed data, deflated, last modified: Sat May 11 
16:45:47 2002, os: Unix
compress 유틸리티를 사용하지 않고 압축하기위해 tar에게 명령을 내리는 때를 제외하고는 위의 작업을 반복할 것이다.
rm backup.tar.gz
tar cvZf backup.tar.Z

ls backup.tar.Z
-rw-r--r--  1 root  wheel  9444468 May 11 16:50 backup.tar.Z

file backup.tar.Z
backup.tar.Z:   compress"d data 16 bits
압축된 아카이브로 파일들을 목록화하기 위해 z (또는 Z) 스위치를 사용해야 한다는 사실을 꼭 기억하기 바란다. 예를 들어 만약 필자가 다음과 같이 실행할 경우
tar tf backup.tar.Z
아래와 같은 이상한 에러를 보게 될 것이다.
tar: Hmm, this doesn"t look like a tar archive.
tar: Skipping to next file header...
cZ\333\300\021\207\335v\333J\235\212\335H\335<\270\377\203\025\323}\333\220\016
\215\335h*d\335?\320\223\333\225\335\206\333\224\335\234\020\007\334\324]m\312D
s.\017\214\256\374\251H\320\016\252\031\332YE\316\304\360\301\003\242\362\301\2
35\327\241\260\261\030\377\t3\256S\320H\t\327\270\204\302\246\335\030\207/\242(
\251
tar: Skipping to next file header...
tar: only read 3188 bytes from archive backup.tar.Z
이 파일이 Z 스위치로 생성되었기 때문에 이 파일로 작업할 때마다 z 스위치를 사용해야 된다는 사실을 잊지 말아야 한다.
tar tZf backup.tar.Z
위의 명령으로 컨텐츠 목록을 얻을 수 있을 것이다. 여러분은 내가 백업을 했을 때 z 스위치로 생성한 아카이브에는 tar.gz 확장자를 부여하고 Z 스위치로 생성한 파일들에는 tar.z 확장자를 부여한다는 사실을 알게 될 것이다. 내가 원하는 것이 무엇이든지 내 아카이브를 호출할 수 있다. 단지 내가 그 파일을 생성할 때 사용한 압축 형태가 무엇인지, tar 아카이브 파일을 어떻게 다루었는지를 기억할 수 있도록 그러한 규약을 사용했다. 이것은 압축되었는지 아닌지, 만약 압축되었다면 z 스위치로 압축되었는지 아니면 Z 스위치로 압축되었는지를 알게끔 해준다. 따라서 아카이브와 관련하여 file 유틸리티를 사용하는 것은 정말 좋은 생각이라고 할 수 있다.

게다가 아카이브 내용을 목록화할 때 v나 verbose스위치도 사용할 수 있다. v 스위치가 없을 경우 결과상 무슨 차이가 있는지를 보여주는 예제는 다음과 같다.
tar tzf backup.tar.gz | tail -2
www/mod_tsunami/pkg-plist
www/Makefile
이제는 v 스위치로
tar tzvf backup.tar.gz | tail -2
-rw-r--r-- test/wheel      116 May 11 09:53 2002 www/mod_tsunami/pkg-plist
-rw-r--r-- test/wheel     9713 May 11 09:53 2002 www/Makefile
백업에서 파일들의 긴 목록을 주의하고 백업파일 자체 긴 목록과 비교해보자.
ls -l backup.tar.gz
-rw-r--r--  1 root  wheel  15098016 May 11 17:31 backup.tar.gz
그 백업파일은 17:31분에 슈퍼유저에 의해 생성되었으나 아직 백업 파일 내에 있는 파일들은 테스트유저에 속한다. 그리고 이 파일들은 9:53분(내가 테스트 디렉토리를 셋업 했을 때)에 생성된 상태 그대로 있다. 이것이 바로 백업된 파일들 소유와 권한을 아카이브가 가지고 있다는 내용으로 지난번 기사에서 전달하고자 했던 사항이다. 또한 tar 명령으로 다중 디렉토리를 백업하라고 지시하는 것도 가능하다.
tar cvzf partial.tar.gz www/apache2 www/chimera www/zope
위의 명령은 생성 (c)에 partial.tar.gz라고 이름 붙은 gzip (z) 파일 (f)를 생성할 것이다. 이는 apache2, chimera, zope 디렉토리의 내용을 아카이브함으로써 가능하다. 일단 백업하기 원하는 파일을 tar 명령에 알려주어야 한다. 그리고 그 이름 뒤에 모든 것들은 tar가 백업할 것이다.

만약 테잎 디바이스를 절약하기위해 플로피를 이용하여 백업을 하고자 한다면 이 명령은 여러분의 현재 디렉토리에 있는 모든 것들을 백업할 것이다.
tar cvMf /dev/fd0 .
플로피 드라이브에 플로피디스크를 넣고 백업하고자 하는 디렉토리에 있는지부터 확인해야 한다. 백업 명을 주기위해 f스위치를 사용하지 않고 플로피 디바이스(/dev/fd0)명을 사용했다.

M이나 다중 볼륨, 스위치를 포함해야 했는가? 데이터 크기가 28M나 되는 디렉토리를 백업해야 하기 때문에 하나의 플로피로 충분하지 않기 때문이다. tar로 첫번째 플로피에 데이터를 기록할 때 M 스위치를 사용했기 때문에 아래와 같은 메시지가 나타났다.

Prepare volume #2 for /dev/fd0 and hit return:
(/dev/fd0를 위해 2번 디스크를 준비하고 리턴키를 눌러라)

플로피에 백업을 할 경우 한 플로피로 충분치 않을 때 M 스위치를 항상 포함시키는 것은 좋은 생각이다. 또한 여러분이 필요로 하는 플로피를 절약하고 싶다면 데이터가 압축될 수 있도록 zZ 스위치도 포함하여야 한다.

플로피에 백업하는 것에 대한 흥미로운 점: 먼저 플로피를 마운트하지 않는다. 일단 백업을 포함하면 플로피를 마운트할 수 없다. 그렇지만 tar 유틸리티가 플로피 데이터를 이해하여 이 명령은 아래와 같이 동작할 수 있다.
tar tvf /dev/fd0
백업을 생성한 후에 이 명령을 수행해야 한다. 그래야 백업 내의 파일들을 확인할 수 있다.

그렇지만 다음과 같은 명령을 시도한다면
mount /dev/fd0 /floppy
아래와 같은 에러 메시지를 받게 된다.
mount: /dev/fd0 on /floppy: incorrect super block
tar: tar로 아카이브를 생성하는 것과 관련된 마지막 사항은 지정된 디렉토리 내의 모든 것을 백업하도록 설계되었다. 이것은 지정된 디렉토리 아래 존재하는 모든 파일과 하부 디렉토리가 백업될 것임을 의미한다. x 스위치를 사용하여 백업하기를 원치 않는 파일을 지정할 수는 있다.

apache2zope 하부 디렉토리들을 제외한 www 디렉토리 내의 모든 것을 백업하고 싶다고 하자. x 스위치를 사용하기 위해 제외시키고 싶은 파일 이름을 포함하는 하나의 파일을 생성해야 한다. 만약 텍스트 에디터로 이 파일을 생성하고자 한다면 동작하지 않을 수도 있다. 그러나 echo를 사용하는 파일을 생성한다면 제대로 동작하게 된다. 그래서 필자는 exclude라 불리는 파일을 만들 것이다.
echo apache2 > exclude
echo zope >> exclude
여기에서 필자는 apache2라는 단어를 새로운 파일인 exclude로 전송(>)하기위해 echo 명령을 사용했다. 그리고 같은 파일에 zope라는 단어를 붙이도록(>>) 요청했다. 만약 두 개의 >를 사용해야 하는 것을 잊었다면 apache2zope로 덮어 썼을 것이다.

x스위치로 사용한 파일을 가지고 있기 때문에 그 백업을 만들 수 있다.
tar cvfX backup.tar exclude www
이것은 스위치 순서가 중요하다는 것을 실험한 첫번째 백업이다. f 스위치가 backup.tar와 관련 있고 x스위치가 exclude와 관련 있다는 것을 tar 명령에 알려줘야 한다. 그래서 x 스위치 앞에 f 스위치를 두기로 했다면 exclude 앞에 backup.tar가 와야 한다. 이 명령은 적절한 스위치가 적절한 단어와 연관되는 것처럼 동작할 것이다.
tar cvXf exclude backup.tar www
그러나 이 명령은 내가 원하는 대로 동작하지 않는다.
tar cvfX exclude backup.tar www
tar: can"t open backup.tar : No such file or directory
여기서 x 스위치를 사용하여 내가 tar 명령에 알려줄 것이 아닌 제외 해야 할 파일이 어느 것인지를 알려주기 위해 backup.tar라는 파일을 찾으라고 tar에게 알려야 함을 알게 될 것이다.

동작했던 명령으로 다시 돌아가자. apache2 파일을 백업하지 않았다는 것을 테스트하기위해 나는 tar의 목록을 통해 분류하기 위해 grep을 사용했다.
tar tf backup.tar | grep apache2
다시 프롬프트를 막 받았기 때문에 exclude 파일이 작동되었다는 것을 알고 있다. apache2www의 하부디렉토리이기 때문에 apache2 하부 디렉토리 내에 있는 모든 파일들은 백업 대상에서 제외된다. 다음으로는 zope 하부디렉토리가 백업에서 배제되었는지를 확인하기위해 다음과 같이 테스트를 하였다.
tar tf backup.tar | grep zope
www/zope-zpt/
www/zope-zpt/Makefile
www/zope-zpt/distinfo
www/zope-zpt/pkg-comment

이 때 "zope"로 시작되는 다른 하부디렉토리들이 있다는 정보를 얻었으나 zope라 불리는 하부디렉토리들은 백업에서 제외되었다.

이제 백업하는 방법을 알았으니 백업에서 데이터를 재저장할 수 있는 방법을 살펴보도록 하자. 지난 기사에서 언급한 상대경로와 절대경로의 차이를 기억해 보기 바란다. 데이터를 재저장할 때 영향을 주기 때문이다. 상대경로는 백업에서는 권장할만한 사항이다. 운 좋게도 FreeBSD시스템에 딸려오는 tar 유틸리티는 슬래시를 떼어낸다. 따라서 p 스위치를 사용하여 기본 설정 값을 뒤엎지 않는 한 항상 상대경로를 사용할 것이다.

만약 누군가로부터 tar 아카이브를 받는다면 재저장하기 전에 아카이브에 데이터를 목록화해 보는 것이 좋다. 절대 경로명을 지시하면서 목록화된 파일들이 "/"로 시작되지 않는다는 것을 확실히 해두기를 원할 것이다. 따라서 필자는 백업에 있는 라인 몇 개를 점검할 것이다.
tar tf backup.tar | head
www/
www/mod_trigger/
www/mod_trigger/Makefile
www/mod_trigger/distinfo
www/mod_trigger/pkg-comment
www/mod_trigger/pkg-descr
www/mod_trigger/pkg-plist
www/Mosaic/
www/Mosaic/files/
www/Mosaic/files/patch-ai
"/"로 시작하는 파일들이 없기 때문에 이 백업파일을 어디라도 재저장 할 수 있다. testing 디렉토리를 만들어서 재저장을 연습해 볼 것이다. 그리고 그 디렉토리에 전체 백업을 재저장 할 것이다.
mkdir testing
cd testing
tar xvf ~test/backup.tar 
내가 재저장된 파일을 가지고 있는 디렉토리로 이동하여 x 스위치를 사용해 backup.tar 파일을 재저장하거나 풀도록 tar 명령에게 지시해야 한다는 사실을 알게 될 것이다. 일단 재저장이 종료되면 필자는 testing 디렉토리 내의 내용을 목록화 할 것이다.
ls
www
그리고 난 후 새로운 www 디렉토리 내용을 목록화하고 하부디렉토리들과 파일들 모두를 포함하는 www 디렉토리 구조가 성공적으로 재저장된 것을 보게 될 것이다.

아카이브에서 특정 파일만을 재저장하는 것도 가능하다. www/chimera 디렉토리에서 하나의 파일을 재저장 해야 한다고 하자. 일단 파일 이름부터 알아야 한다. 그 다음 tar에서 하나의 목록을 얻고 난 후 chimera 하부디렉토리 내의 파일들 중에서 그 파일을 찾기 위해 grep를 사용할 것이다.
tar tf backup.tar | grep chimera
www/chimera/
www/chimera/files/
www/chimera/files/patch-aa
www/chimera/scripts/
www/chimera/scripts/configure
www/chimera/pkg-comment
www/chimera/Makefile

나는 www/chimera/Makefile 파일만을 재저장하고 이 파일을 genisis라는 사용자 홈 디렉토리로 재저장 하고 싶다. 우선 그 파일이 재저장되기 원하는 디렉토리로 이동한 후 tar 명령에게 파일을 재저장하라고 지시할 것이다.
cd ~genisis
tar xvf ~test/backup.tar www/chimera/Makefile
홈에서 이러한 작업을 시도한다면 몇 가지 재미난 현상을 볼 수 있을 것이다. genisis 홈 디렉토리를 목록화 해보았을 때 Makefile이라는 파일이 아니라 www 디렉토리를 보게 되었다. 이 디렉토리는 chimera라는 하부디렉토리를 가지고 있으며 Makefile 파일을 가지고 있다. 여러분이 하나의 아카이브를 만들 때 하나의 디렉토리 구조를 포함하고 있으며 하나의 아카이브를 재저장할 때 그 디렉토리 구조를 재생성해야 함을 기억해야 한다.

원래 소유, 권한, 파일 생성 시간들이 그 파일과 같이 재저장된다는 것을 명심해야 한다.
ls -l ~genisis/www/chimera/Makefile
-rw-r--r--  1 test  wheel  406 May 11 09:52 www/chimera/Makefile
tar 유틸리티를 사용하여 시작하도록 해야 한다. 다음번 기사에서는 tar로 사용 할 수 있는 기타 몇몇 흥미로운 옵션들에 대해 살펴보고 cpio 아카이버도 소개할 것이다.

드루 라빈(Dru Lavigne)은 캐나다 온타리오주 킹스톤에 있는 공과 전문대학교에서 네트워크를 가르치고 있다. 하나의 테스트 머신에서 얼마나 많은 운영체제를 멀티 부팅할 수 있는지를 증명하는데 강한 집념을 가지고 있는 것으로 유명하다.
TAG :
댓글 입력
자료실

최근 본 책0